#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <pthread.h>

#include "task_limit.h"

#define LEFT    30000000
#define RIGHT   30000200
#define THRNUM  (RIGHT - LEFT  + 1)
#define N 		4

static limit_t *limit;

// 需要定义在main上面，否则找不到，或者先声明
static void *calculate(void *arg)
{
	int i, j, mark;
    i = (int)arg; // 使用这种强转的方式，编译的时候会存在警告

    mark = 1;
    for (j = 2; j < i/2; j++) {
        if (i % j == 0) {
            mark = 0;
            break;
        }
    }

	// 暂停500ms
    usleep(500);

    if (mark)
        printf("%d is a primer\n", i);

	// 线程工作结束，归还可用任务数量
	limit_add(limit, 1);
    pthread_exit(NULL);

}

int main(int argc, char **argv)
{
	int i, err;
	pthread_t tids[THRNUM];

	// 可以同时执行4个线程来处理任务
	limit = limit_init(N);

	for (i = LEFT; i <= RIGHT; ++i) {
		
		// 判断是否可以执行任务，会同时执行4个线程
		limit_sub(limit, 1);

		// 最后一个参数传递是整型，而不是一个地址，因为多个线程公用一个指针会产生竞争，导致冲突
		err = pthread_create(tids + (i-LEFT), NULL, calculate, (void *)i);
		if (err) {
            fprintf(stderr, "pthread_create(): %s\n", strerror(err));
            exit(1);
        }	
	}

	for (i = LEFT; i <= RIGHT; ++i) {
        pthread_join(tids[i-LEFT], NULL);
    }

	limit_destory(limit);

	exit(0);
}
